home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
dev
/
asm
/
Asm_Course2.lha
/
Teil07.TXT
< prev
next >
Wrap
Text File
|
1992-09-02
|
15KB
|
319 lines
A S S E M B L E R - K U R S (c) Jeff Kandle 1990
7.Teil...
So, weiter mit den Bildern....Ausser Groesse farben, anzahl und
laenge, muss der Amiga noch wissen wo er die Plane findet die er darstellen
soll. Dazu dienen die sogenannten Bitplanepointer. Sie liegen fuer die
erste Plane bei $dff0e0 und $dff0e2.
In dem nun folgenden listing habe ich die ganzen einstellungen in die
Copperliste gesteckt..Obwohl man groesse und anzahl der Planes auch einmal
einstellen kann ist es besser es immer wieder in der Copperliste macht.
Erstmal das listing, dann werde ich die neue sache erklaeren..
start:
execbase= 4
openlibrary= -408
vhposr= $dff006
forbid= -30-102
permit= -30-108
dmacon= $dff096
intena= $dff09a
dmaconr= $dff002
cop1lc = $dff080
move.w #$0020,dmacon
move.w #$4000,intena
move.l execbase,a6
jsr forbid(a6)
Lea $5fffc,a0
Lea $dff180,a1
Move.w #1,d0
Colorloop:
Move.w (a0)+,(a1)+
dbf d0,colorloop
move.l #copperliste,cop1lc
wait:
btst #6,$bfe001
bne wait
move.l execbase,a6
jsr permit(a6)
lea gfxname(pc),a1
jsr openlibrary(a6)
move.l d0,a6
move.w #$83e0,dmacon
move.w #$c000,intena
move.l 38(a6),cop1lc
moveq #0,d0
rts
gfxname: dc.b "graphics.library",0
>Extern "bild1.raw",$5fffc
even
copperliste:
dc.w $00e0,$0006 ;Hi und Lo pointer der planeadresse im ram
dc.w $00e2,$0000
dc.w $0100,$1200 ;Bplcon0 1 Plane, Lores
dc.w $008e,$3081 ;Diwstrt
dc.w $0090,$30c1 ;Diwstop
dc.w $0092,$0038 ;Ddfstrt
dc.w $0094,$00d0 ;Ddfstop
dc.l $-2
So das ist es, ihr koenntet es euch rausschneiden..es ist einen etwas
verbesserte Version des alten Copperliste programm. Geaendert wurden sachen
die hinterher beim Ausbauen des Listing, stoeren wuerden...und vielleicht
sogar Guru`s veranstalten.
Wichtig ist das ihr nach dem Assemblieren `Y` drueckt und return bevor ihr
das mit `J` startet, damit das Bild nachgeladen wird.
So die erste aenderung die euch aufallen wird, sind zwei neue register,
naemlich DMACON und INTENA.
Das register INTENA heiát INterupts ENAble, was soviel bedeutet Erlaubte
Interupts. Mit ihm schaltet man alle moeglichen interrupts des Amiga an
oder aus...wir schalten sie aus....das gekoppelt mit Forbid, gibt uns die
ganze zeit des Amigas, er macht jetzt nur noch das was wir wollen.
Das zweite neue register ist DMACON. Es oeffnet die Tore fuer die einzelnen
DMA kanaele. Was DMA (direct Memory Access) ist wisst ihr schon. Es gibt
fuer alles, was der Amiga kann DmA kanaele, vom und zum Ram. Diese kanaele
werden solange sie angeschaltet sind immer wieder auf inhalt ueberprueft,
auch wenn man ueberhaupt nichts z.b mit sprites macht, wird dauernd
ueberprueft. Das kostet natuerlich zeit, deshalb schalten wir direkt mal
die Sprite DMA aus, da wir die im moment nicht brauchen.
So, jetzt muss ich euch aber noch etwas ueber das DMACON und INTENA
register erklaeren.
In den 16 Bits der Register, sind 15 schalter der die DMA kanaele oder die
Interrupts eingebaut. Der 16 schalter sagt wie der Zugriff ausssieht.
Den Wert den ich in diese Register schreibe ist eigentlich garnicht der der
hinterher drin steht. Den das 16 Bit sagt aus was gemacht wird. Ist es
gesetzt, werden alle bits die im Wort was ich dort hinschreibe gesetzt sind
auch im DMACON register gesetzt. Ist es geloescht, werden alle im Wert
gesetzten Bits, im DMACON register geloescht. Mit dem Wort das ich am
anfang in das DMACON register schreibe, schalte ich den Sprite Kanal aus.
Der wert ist #$0020, in Bits 0000000000100000, das heisst das das Fuenfte
Bit geloescht wird. Bit 5 ist fuer den SpriteKanal.
Wenn ich wie jetzt vom Cli aus komme, sind Sprite, Bitplane und Blitter DMA
angeschaltet. Die bitplane DMA muss ich an lassen, damit wir uberhaupt ein
Bild sehen, die Blitter dma kann ich ruhig anlassen, weil es sich mit ihm
etwas anders verhaelt, da dort ein Chip dahinter steht der den Kanal
ueberprueft, und darum kostet es uns keine Zeit, deshalb lassen wir ihn
einfach an.
Allerdings werden sich einige jetzt fragen warum ich den Sprite kanal
ausschalten, wir brauchen doch kaum Zeit, ein Voellig einfaches Programm,
wieso muss man denn da schon Zeit sparen ? Ganz einfach...Die Sprites im
Amiga haben eine Sehr schlechte angewohnheit. Sobald ihr Kanal angeschaltet
wird sind sie auch da. Da sie aber kein Aussehen und keine Bildschirm
Position zugewiesen bekommen haben, schnappen sie sich immer die werte die
sie gerade auf dem datenBus finden. Deshalb sieht man nur Truemmer.
Probierts es doch mal aus, loescht einfach die erste Zeile mit dem DMACON
ganz, dann koennt ihr das sehen, wie das aussieht....
So wenn ihr weiter guckt faellt euch die Colorcopy-routine auf, sie setzt
die Farben aus der Colormap, die ja vor der Bitplane liegt (habt ihr
eingestellt).
Wenn ihr bald mit mehr farben arbeitet dann muesst ihr natuerlich auch
diese Routine umstellen, wie das wisst ihr schon.
Das Oeffnen der Graphics.Library habe ich jetzt nach unten verlegt, es kann
schwierigkeiten geben wenn man wie ich das vorher gemacht habe. Erst die
Graphics.library oeffnen, zeiger retten und dann am ende auslesen. Es kommt
schon mal vor das man dort arbeitet wo dann die geoeffnete Library liegt.
Und dann ueberschreibt man sie und kriegt nicht mehr den wert den man
braucht. Das ist mir schon passiert, und dann wundert man sich... aber
sowas wird euch bestimmt auch noch oft genug passieren.
So, jetzt kommen wir zu einem Neue Seka befehl, de das Einbinden von
Dateien erlaubt...bzw. er laedt dateien in den Amiga Speicher ein. Das
koennen Bilder, Musiken oder alles moegliche sein. Seine Syntax lautet
>Extern "Name",Ziel (label oder Adresse), Laenge (Label oder fester wert)
also ein beispiel aufruf, der die ertsen 5000 Bytes vom Bild mit dem Namen
Auto nach $40000 einlaedt saehe dann so aus - >Extern "Auto",$40000,5000
Die option laenge braucht man eigentlich nie, deshalb lasse ich die immer
weg.
Aktiviert wird das ganze nach dem Assemblieren mit `Y`, dann schaut der
Seka das Listing nochmal nach Externen Kommandos durch und fuehrt diese
dann aus.
Noch was...wenn ihr die Funktion Openlibrary benutzt, achtet darauf das der
name der Library genauso geschrieben ist wie es im Buch oder in meinem Kurs
steht...naemlich klein und mit punkt getrennt, sonst erkennt der Befehl
diese nich und bricht ab...
graphics.library ist der absolut richtige name dafuer...also denkt dran.
Was man machen muss um ein Bild mit 32 farben darzustellen ist ja wohl
klar..aber ich erklaere es doch lieber mal.
Also erstmal das Bild ueberhaupt malen. Konvertieren (denkt an die
Colormap, sie sollte davor liegen).
Dann muesst ihr das >Extern kommando um schreiben 1. Den neuen namen
einsetzen 2. muesst ihr den Ladebeginn vorverlegen, da die Colormap jetzt
ja groesser ist. Wieviel ihr das jetzt vorverlegen muesst rechnet man so
aus....Farben*2 , bei 32 farben sind das 64 bytes...64 in Hexdezimal sin
$40, jetzt muesst ihr nur noch Bildanfang -$40 rechnen. Bei $60000 weare
das dann $5ffc0..also die adresse im Extern kommando muss also $5ffc0
lauten. Genau diese Adresse muesst ihr dann natuerlich auch in der
Farbenroutine einsetzen, und den Counter auf 32-1 setzen.
Dann muesst ihr noch in der Copperliste das BPLCON0 register auf $5200
setzen, da es 5 planes sind. Dann muesst ihr natuerlich noch die
BitplanePointer fuer die weiteren planes setzen. Da die Planes im
RAW-Format alle hintereinander liegen, koennen wir die weiteren Adresse
einfach ausrechnen. Also, unser Bild hat die maáe 320*256, das sind 256 mal
320 bits. Erstmal brauchen wir die Bytes..also 320/8 gleich 40. 40 mal 256
gleich 10240...in Hex $2800. Also lauten die Bitplane Startadressen so
1. $60000
2. $62800
3. $65000
4. $67800
5. $6a000
Einsetzen duerfte kein Problem mehr sein oder...
Falls das zu schwierig war muesst ihr leider die Letzten zwei Teile nochmal
durchlesen, denn dann ist etwas Falsch gelaufen.
Natuerlich waere es besser ihr wuerdet das jetzt mal selber versuchen, um
zu sehen was man schon kann. Das fertige teil kommt natuerlich bei dem
Naechsten Effekt als listing rueber, aber das ist ja nicht der Sinn der
Sache, oder ?
So jetzt koennt ihr erstmal einen Zeit mit dem Krempel rumspielen, und alle
moeglichen Bilder Konvertieren. Ihr solltet auch mal versuchen mit
Interlace, oder Hires zu arbeiten..wir werden das in diesem Kurs zwar nicht
benutzen, aber vielleicht findet einer seine leidenschaft darin und
arbeitet fortan nur dadrin. Es ist relativ einfach den Kurs auf Hires
umzusetzen. Naja..ich persoenlich halte nicht soviel von dem Flackern was
der Amiga uns da praesentiert. Die einzige schoene sache ist der HAM modus,
er ist allerdings ziemlich speicherverbrauchend (heisst doch so, oder ?)
Jetzt mal eine kleine erklaerung....Eine sache die ihr euch vielleicht auch
schon mal gefragt habt.
Ein Freund fragte mich letztens "Hoermal Sascha, warum arbeiten wir den im
RAW-format wenn wir Bilder darstellen, und nicht im IFF format wie die
ganzen Malprogramme es tun. Die werden doch sicher einen Grund haben das zu
tun. Und wenn ich mir den Umstand angucke, vonwegen das mit dem
Konvertieren und so, verstehe ich das nicht so recht"
Is Klar was er meint.....Aber der Amiga kann halt nur im RAW formt
arbeiten...das IFF-ILBM format, wie es fuer bilder heisst. Ist ein Pack
verfahren. Die bilder werden auf eine ganze bestimmte art und weise
Zusammen gepackt, gleichzeitig werden auch alle wichtigen daten des Bildes
mit abgespeichtert, als da waeren ..Farben, Groesse...Anzahl der Planes,
modus und so. Das IFF-Format gibt es auch fuer
TextFiles..Samples..Musikstuecke. Es soll den Daten Transfer verschiedener
Programm untereinander ermoeglichen...ne tolle Idee...aber wir muessen das
dann erstmal Konvertieren...Es ist keine Atemberaubende Sache die Dateien
zu entpacken, allerdings dauert es ein Parr sekunden, und das waere Extrem
langweilig finde ich, und deshalb Konvertieren wir das Vorher, O.K ?
So, nachdem wir auch mal Bilder dargestellt haben koennen wir schon
anfangen etwas ansehnliches zu Bauen. Dazu muessen wir aber das Thema
Bilder wieder kurz verlassen, um dann mit einem Sagenhaften effekt wieder
zu kommen.
Wer kennt nicht Stripes, dieses Schicke Cli farbspielerei, bei der es
aussieht als wenn der Bildschirm von einem Dicken Rohr durchzogen wuerde,
oder andere sachen, bei denen der ganze bildschirm von Rohren (die richtige
bezeichnung ist Tubes (sprich : Tjubs) ueberzogen ist. Nette sache..habt
ihr denn schon mal versucht eine selbstgemachte diashow mit einen der
Zahlreichen IFF anzeige Routinen zu machen...Hah, das war wohl nichts, in
dem meisten faellen jedenfalls. Warum ist klar, die eine Copperliste Stellt
die andere ab. Deshalb werden wir diesen Effekt zusammen mit einem Bild.
Erstmal die Beschriebung der Technik dieser `Tubes`.
Jede Zeile wird von Copper abgewartet, und dann ein farbwert aus einer
Tabelle reingschrieben. Die Tabelle ist so angelegt das die einzelnen
Farbtoenne immer nur einige Nouancen unterscheiden. Wenn man diese Tabelle
von Dunkel bis nach hell und dann wieder bis dunkel macht, und das auf
einem Kleinen raum dann kommt eine Tubes zustande.
Wenn wir allerdings den Ganzen bildschirm mit Tubes ueberziehen wollten.
dann wir schon im NTSC bereich 256 zeilen. Auf die Art und weise wie wir
das jetzt machen, vonwegen die Copperliste direkt im SourceCode ablegen,
das hieáe, wir haetten 512 zeilen Text nur fuer die Copperliste. Das waere
wohl doch ein Bisschen sehr viel arbeit, oder ?
Deshalb arbeiten wir mit einer Routine von 10 bis 12 Zeilen die uns diese
Copperliste erstellt.
Das heisst wir legen die einzelnen Elemente die so eine Copperliste hat,
wie z.b der move-befehl, oder die Farbadresse $180 in die Datenregister,
dann legen wir eine Tabelle an fuer die Farben (das machen wir hinterher)
und wir setzen das erste wort fuer den Wait befehl in ein Register.
Dann durchlaufen wir eine Schleife, indem alle Bausteine die noetig sind
immer wieder auf die Copperliste gesetzt werden, das ist wie ein Haus
bauen.
Ein durchlauf muesste dann so ausehen das erstmal die Position fuer den
Waitbefehl geschrieben wird, dann der Wait befehl selber...dann kaeme das
farbregisert was ich ansprechen will (in unserem fall waere das $0180 oder
$0182) und dann der Farbwert der in das Register geschrieben werden soll.
Dann muesste das Positions wort fuer den Wait befehl, so bearbeitet werden
das es auf die naechste Zeile zeigt, und das wort fuer die Farbe muesst
geaendert werden. Ob das durch auslesen einer Tabelle oder durch normales
Addieren geschieht (was uebrigens auch schoene Effekte zustande bringt) ist
erstmal gleich. Jetzt kommt erstmal so eine Routine, die eine Solche
Copperliste erstellt. Wie man sie Einbaut das zeige ich dannach.
Lea $50000,a0 ; Adresse ab der die Copperliste liegen
; soll.
Move.w #$-2,d0 ; Wait-befehl ($fffe) nach d0
Move.w #$0180,d1 ; Farbregister wert nach d1
Move.w #$200f,d2 ; Erstes Positions wort fuer den Waitbefehl
; nach d2
Move.w #$0000,d3 ; Erstes farbwort nach d3
Move.w #$80,d4 ; Counter nach d4
Copperloop:
Move.w d2,(a0)+ ; Durch die Postinkrementale adressierung
; koennen wir die Copperliste stueck fuer
; stueck zusammen bauen. Erstes Positions
; Wort schreiben.
Move.w d0,(a0)+ ; Wait-Befehl schreiben
Move.w d1,(a0)+ ; Erste farbregisterwort setzen
Move.w d3,(a0)+ ; Erstes Farbwort setzen
; Jetzt ist der erste Durchlauf geschafft.
; Wir beginnen mit dem Modifizeren der
; Ausgangswerte.
Add.w #$0100,d2 ; Waitpostionswort auf die naechste zeile
; setzen.
Add.w #$0003,d3 ; Farbwert addieren
/\
Dbf d4,copperloop ; waren es schon $80 zeilen, wenn nicht _]
; Zueruck
Move.l #$01800000,(a0)+ ; Ganz unten wieder auf schwarz schalten
Move.l #$-2,(a0)+ ; $fffffffe als endemarkierung fuer die
; Copperliste.
Move.l #$50000,cop1lc ; Erstellte Copperliste auch aktivieren
Das prinzip duerfte klar sein, oder...
In der Naechsten Folge bauen wir das ding ein...
C.U.
Jeff Kandle